{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "56ab457f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入相关的库\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "from sklearn.metrics import confusion_matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2438c0eb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户ID</th>\n",
       "      <th>性别</th>\n",
       "      <th>年龄</th>\n",
       "      <th>预计工资</th>\n",
       "      <th>是否购买</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15624510</td>\n",
       "      <td>Male</td>\n",
       "      <td>19</td>\n",
       "      <td>19000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>15810944</td>\n",
       "      <td>Male</td>\n",
       "      <td>35</td>\n",
       "      <td>20000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>15668575</td>\n",
       "      <td>Female</td>\n",
       "      <td>26</td>\n",
       "      <td>43000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>15603246</td>\n",
       "      <td>Female</td>\n",
       "      <td>27</td>\n",
       "      <td>57000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>15804002</td>\n",
       "      <td>Male</td>\n",
       "      <td>19</td>\n",
       "      <td>76000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>395</th>\n",
       "      <td>15691863</td>\n",
       "      <td>Female</td>\n",
       "      <td>46</td>\n",
       "      <td>41000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>396</th>\n",
       "      <td>15706071</td>\n",
       "      <td>Male</td>\n",
       "      <td>51</td>\n",
       "      <td>23000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>397</th>\n",
       "      <td>15654296</td>\n",
       "      <td>Female</td>\n",
       "      <td>50</td>\n",
       "      <td>20000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>398</th>\n",
       "      <td>15755018</td>\n",
       "      <td>Male</td>\n",
       "      <td>36</td>\n",
       "      <td>33000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>399</th>\n",
       "      <td>15594041</td>\n",
       "      <td>Female</td>\n",
       "      <td>49</td>\n",
       "      <td>36000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>400 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         用户ID      性别  年龄   预计工资  是否购买\n",
       "0    15624510    Male  19  19000     0\n",
       "1    15810944    Male  35  20000     0\n",
       "2    15668575  Female  26  43000     0\n",
       "3    15603246  Female  27  57000     0\n",
       "4    15804002    Male  19  76000     0\n",
       "..        ...     ...  ..    ...   ...\n",
       "395  15691863  Female  46  41000     1\n",
       "396  15706071    Male  51  23000     1\n",
       "397  15654296  Female  50  20000     1\n",
       "398  15755018    Male  36  33000     0\n",
       "399  15594041  Female  49  36000     1\n",
       "\n",
       "[400 rows x 5 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据集，并选择特征列\n",
    "dataset = pd.read_csv('data/user_data.csv', encoding='gbk')\n",
    "X = dataset.iloc[:, 2:4].values\n",
    "y = dataset.iloc[:, 4].values\n",
    "dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "14eebe92",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 切分数据集，为训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test =train_test_split(X,y,test_size= 0.25,\n",
    "                                                   random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d2e0cdd3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(400, 5) (300, 2) (100, 2) (300,) (100,)\n"
     ]
    }
   ],
   "source": [
    "print(dataset.shape, X_train.shape, X_test.shape, y_train.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "29980ad0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[    44,  39000],\n",
       "       [    32, 120000],\n",
       "       [    38,  50000],\n",
       "       [    32, 135000],\n",
       "       [    52,  21000]], dtype=int64)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "700f97a7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   30, 87000],\n",
       "       [   38, 50000],\n",
       "       [   35, 75000],\n",
       "       [   30, 79000],\n",
       "       [   35, 50000]], dtype=int64)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "952c4e44",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入标准器，使用它，在训练集X和测试集X进行标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "sc_X = StandardScaler()\n",
    "X_train = sc_X.fit_transform(X_train)\n",
    "X_test = sc_X.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "9144a1a6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.58164944, -0.88670699],\n",
       "       [-0.60673761,  1.46173768],\n",
       "       [-0.01254409, -0.5677824 ],\n",
       "       [-0.60673761,  1.89663484],\n",
       "       [ 1.37390747, -1.40858358]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "7396efca",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.80480212,  0.50496393],\n",
       "       [-0.01254409, -0.5677824 ],\n",
       "       [-0.30964085,  0.1570462 ],\n",
       "       [-0.80480212,  0.27301877],\n",
       "       [-0.30964085, -0.5677824 ]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6ae4bddc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LogisticRegression(random_state=0)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">LogisticRegression</label><div class=\"sk-toggleable__content\"><pre>LogisticRegression(random_state=0)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "LogisticRegression(random_state=0)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 导入逻辑回归模型类，并实例化，接着在训练集上训练\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "classifer=LogisticRegression(random_state=0)\n",
    "classifer.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "85e83538",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>actual</th>\n",
       "      <th>prediction</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>100 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    actual  prediction\n",
       "0        0           0\n",
       "1        0           0\n",
       "2        0           0\n",
       "3        0           0\n",
       "4        0           0\n",
       "..     ...         ...\n",
       "95       1           0\n",
       "96       0           0\n",
       "97       1           0\n",
       "98       1           1\n",
       "99       1           1\n",
       "\n",
       "[100 rows x 2 columns]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 在测试集进行预测\n",
    "y_pred = classifer.predict(X_test)\n",
    "\n",
    "temp = pd.DataFrame({'actual': y_test, 'prediction': y_pred})\n",
    "temp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "bc92a209",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.58308908, 0.41691092],\n",
       "       [0.21824871, 0.78175129],\n",
       "       [0.99149077, 0.00850923],\n",
       "       [0.99207365, 0.00792635],\n",
       "       [0.96750141, 0.03249859],\n",
       "       [0.91608066, 0.08391934],\n",
       "       [0.98628144, 0.01371856],\n",
       "       [0.52483762, 0.47516238],\n",
       "       [0.14989075, 0.85010925],\n",
       "       [0.27844761, 0.72155239]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "classifer.predict_proba(X_test)[-10:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "23fd4aec",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[65  3]\n",
      " [ 8 24]]\n"
     ]
    }
   ],
   "source": [
    "# 对比预测结果和实际值，生成混淆矩阵\n",
    "cm = confusion_matrix(y_test, y_pred)\n",
    "print(cm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "fca8cace",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x1aa2a370970>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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cOCAhg8frlWrVik2Ntaj67iVyCsqKloVJAAAwSLQXz9bvXq1y7rFYlF+fr7y8/O9um6rx8gbGxu1bds2NTU1eRUAAABtog0nu7UljxP50aNHNXXqVMXExOj888/Xrl27JB0fG3/kkUd8HiAAADg1jxP5fffdp48//lirV692eTbu8ssv13PPPefT4AAA8B2LD5bg4/ELYZYvX67nnntOI0aMcHlovX///vrqq698GhwAAD7jbXs8XFrr+/btU0JCQovttbW1Hr+NBgAAeMfjRD5s2DD985//dK6fSN6LFi3SyJEjfRcZAAC+FKaT3TxurRcWFurKK6/Uli1b1NTUpEcffVSbN2/Wv/71L5WXl/sjRgAAvPeDL5i1+vwg5HFFPmrUKL3//vs6evSozj33XK1atUp2u13/+te/NHToUH/ECAAATqFVXz8bOHCgSktLfR0LAAB+46vPmAabViXy5uZmLVu2TFu3bpXFYlG/fv00btw4tW/PV1EBAEEqTGete5x5P/vsM40bN05VVVXq06ePJOnzzz/X2WefrZdfflkDBw70eZAAAODkPB4jv/XWW3X++edr9+7d+uijj/TRRx+psrJSgwYN0u233+6PGAEA8N6JyW7eLEHI44r8448/1vr163XWWWc5t5111lmaPXu2hg0b5tPgAADwFYtxfPHm/GDkcUXep08fffPNNy22V1dX67zzzvNJUAAA+FyYPkfuViKvqalxLgUFBZoxY4ZeeOEF7d69W7t379YLL7yg3NxczZkzx9/xAgCAH3Crtd65c2eX168ahqHrrrvOuc34fk7+2LFj1dzc7IcwAQDwUpi+EMatRP7222/7Ow4AAPzLzI+fjR492t9xAACAVmj1G1yOHj2qXbt2qbGx0WX7oEGDvA4KAACfM3NF/kP79u3Tz372M7322msn3c8YOQAgKIVpIvf48bPc3FwdOHBAa9euVXR0tFauXKnS0lKlpaXp5Zdf9keMAADgFDyuyN966y299NJLGjZsmCIiItSjRw9lZmbKZrOpsLBQV199tT/iBADAO2E6a93jiry2tlYJCQmSpPj4eO3bt0/S8S+iffTRR76NDgAAHznxZjdvlmDUqje7bdu2TZJ0wQUXaOHChfr666/15z//WUlJST4PEAAAnJrHrfXc3Fzt3btXkvTggw/qiiuu0NNPP63IyEgtWbLE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hvO8xYsXq1+/foqKilLfvn31+OOPu9znww8/1JAhQxQVFaX09HRt3LjR4z+joqIiDRw4UB07dlRKSopycnJ05MiRFsctX75cvXv3VlRUlDIzM1VZWemy/5VXXtHQoUMVFRWlXr166aGHHlJTU5PH8QDwHIkcphEdHa1jx44517/88ks9//zzevHFF52t7auvvlpVVVVasWKFNmzYoAsvvFCXXXaZvvvuO0nS888/rwcffFCzZ8/W+vXrlZSU1CLB/qf77rtPc+bM0f33368tW7Zo6dKlstvtko4nY0l64403tHfvXv3jH/+QJC1atEh5eXmaPXu2tm7dqoKCAt1///0qLS2VJNXW1uqaa65Rnz59tGHDBuXn5+vuu+/2+M8kIiJC8+fP12effabS0lK99dZbmjVrlssxR48e1ezZs1VaWqr3339fNTU1mjhxonP/66+/rhtuuEEzZszQli1btHDhQi1ZssT5ywoAPzOAMDRlyhRj3LhxzvUPPvjA6NKli3HdddcZhmEYDz74oNGhQwejurraecybb75p2Gw2o76+3uVa5557rrFw4ULDMAxj5MiRxvTp0132Dx8+3Bg8ePBJ711TU2NYrVZj0aJFJ42zoqLCkGRs3LjRZXtKSoqxdOlSl22///3vjZEjRxqGYRgLFy404uPjjdraWuf+kpKSk17rh3r06GHMmzfvlPuff/55o0uXLs71xYsXG5KMtWvXOrdt3brVkGR88MEHhmEYxiWXXGIUFBS4XOepp54ykpKSnOuSjGXLlp3yvgBajzFyhK1XX31VnTp1UlNTk44dO6Zx48bpsccec+7v0aOHzj77bOf6hg0bdOTIEXXp0sXlOnV1dfrqq68kSVu3btX06dNd9o8cOVJvv/32SWPYunWrGhoadNlll7kd9759+1RZWampU6fqtttuc25vampyjr9v3bpVgwcPVkxMjEscnnr77bdVUFCgLVu2qKamRk1NTaqvr1dtba06duwoSWrfvr3S09Od5/Tt21edO3fW1q1b9aMf/UgbNmzQunXrXCrw5uZm1dfX6+jRoy4xAvA9EjnC1pgxY1RSUqIOHTooOTm5xWS2E4nqBIfDoaSkJK1evbrFtVr7CFZ0dLTH5zgcDknH2+vDhw932deuXTtJkmEYrYrnh3bu3KmrrrpK06dP1+9//3vFx8frvffe09SpU12GIKTjj4/9pxPbHA6HHnroIU2YMKHFMVFRUV7HCeD0SOQIWx07dtR5553n9vEXXnihqqqq1L59e/Xs2fOkx/Tr109r167VTTfd5Ny2du3aU14zLS1N0dHRevPNN3Xrrbe22B8ZGSnpeAV7gt1u1znnnKPt27dr8uTJJ71u//799dRTT6murs75y8Lp4jiZ9evXq6mpSX/84x8VEXF8uszzzz/f4rimpiatX79eP/rRjyRJ27Zt08GDB9W3b19Jx//ctm3b5tGfNQDfIZED37v88ss1cuRIjR8/XnPmzFGfPn20Z88erVixQuPHj1d6erruuusuTZkyRenp6br44ov19NNPa/PmzerVq9dJrxkVFaV7771Xs2bNUmRkpC666CLt27dPmzdv1tSpU5WQkKDo6GitXLlS3bp1U1RUlOLi4pSfn68ZM2bIZrMpOztbDQ0NWr9+vQ4cOKCZM2dq0qRJysvL09SpU/Xb3/5WO3bs0B/+8AePft5zzz1XTU1NeuyxxzR27Fi9//77+vOf/9ziuA4dOujOO+/U/Pnz1aFDB/3iF7/QiBEjnIn9gQce0DXXXKOUlBRde+21ioiI0CeffKJPP/1UDz/8sOf/IwB4hFnrwPcsFotWrFihSy+9VLfccot69+6tiRMnaseOHc5Z5tdff70eeOAB3XvvvRo6dKh27typn//856e97v33369f/epXeuCBB9SvXz9df/31qq6ulnR8/Hn+/PlauHChkpOTNW7cOEnSrbfeqr/85S9asmSJBg4cqNGjR2vJkiXOx9U6deqkV155RVu2bNGQIUOUl5enOXPmePTzXnDBBSoqKtKcOXM0YMAAPf300yosLGxxXExMjO69915NmjRJI0eOVHR0tJ599lnn/iuuuEKvvvqqysrKNGzYMI0YMUJFRUXq0aOHR/EAaB2L4YvBNgAAEBBU5AAAhDASOQAAIYxEDgBACCORAwAQwkjkAACEMBI5AAAhjEQOAEAII5EDABDCSOQAAIQwEjkAACGMRA4AQAj7/xIPp4ye1jjEAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 一图胜千言，使用图像展示混淆矩阵\n",
    "from sklearn.metrics import ConfusionMatrixDisplay\n",
    "\n",
    "disp = ConfusionMatrixDisplay(confusion_matrix=cm,\n",
    "                              display_labels=classifer.classes_)\n",
    "\n",
    "disp.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "313bf306",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def logistic(input):\n",
    "    return 1.0 / (1 + np.exp(-input))\n",
    "\n",
    "z = np.linspace(-10, 10, 1000)\n",
    "y = logistic(z)\n",
    "plt.plot(z, y)\n",
    "plt.axhline(y=0, ls='dotted', color='k')\n",
    "plt.axhline(y=0.5, ls='dotted', color='k')\n",
    "plt.axhline(y=1, ls='dotted', color='k')\n",
    "plt.yticks([0.0, 0.25, 0.5, 0.75, 1.0])\n",
    "plt.xlabel('z')\n",
    "plt.ylabel('y(z)')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e972e207",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
